# _*_ coding: UTF-8 _*_
# @Time     : 2021/11/2 16:18
# @Author   : 郑鲁明
# @Site     : http://www.hzdledu.cn/
# @File     : 等待.py
# @Software : PyCharm
from selenium import webdriver
import time
from selenium.webdriver.common.keys import Keys


# 等待机制
# 为了同步页面加载和自动化操作，需要在操作动作之前加入等待
# 打开页面之后，页面刷新，菜单弹出

# 等待机制有3种：
# 1.强制等待
# 2.隐式等待
# 3.显式等待
# 可以混合使用三种等待方式：1和3   1和2  但是隐式 显式等待不可混用





# 1.强制等待
# time.sleep(时间)强制线程休眠一段时间
# 等待时间不可调整，一般用于演示以及调试
def foo1():
    driver = webdriver.Chrome()
    driver.maximize_window()
    driver.get('http://news.baidu.com/')
    time.sleep(1)  # 强制等待
    driver.quit()


# 2.隐式等待
# 等待页面的所有元素加载完成，不会等待页面部分刷新，及菜单刷新
# 只用设置一次，在driver生命周期都有效，等待时间为弹性时间，是最大的等待时长
def foo2():
    driver = webdriver.Chrome()

    # 设置隐式等待
    # implicitly_wait(second) :second为最大等待时间
    driver.implicitly_wait(30)

    driver.maximize_window()
    driver.get('https://www.jd.com/')

    driver.find_element_by_id('key').send_keys('显示器')
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="search"]/div/div[2]/button/i').click()
    time.sleep(2)
    driver.find_element_by_xpath('/html').send_keys(Keys.PAGE_DOWN)

    for i in range(1, 6):
        driver.find_element_by_xpath(f'//*[@id="J_goodsList"]/ul/li[{i}]/div/div[1]/a/img').click()
    handles = driver.window_handles
    for handle in handles:
        driver.switch_to.window(handle)
        url = driver.current_url  # 获取url
        if url == 'https://item.jd.com/100005855774.html':
            break

    driver.quit()


# 显式等待
# 设置一个最大等待时间，每0.5s检查一次等待条件是否成立
# 在具体操作之前添加响应的等待语句
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By


def foo3():
    driver = webdriver.Chrome()

    # 生成等待类对象，设置最大等待时间
    wait = WebDriverWait(driver, 30)

    driver.maximize_window()
    driver.get('https://www.jd.com/')

    #  等待搜索输入框
    wait.until(expected_conditions.presence_of_element_located((By.ID, 'key')))
    # 一定要多加一个()

    driver.find_element_by_id('key').send_keys('显示器')
    time.sleep(1)
    driver.find_element_by_xpath('//*[@id="search"]/div/div[2]/button/i').click()
    time.sleep(2)
    driver.find_element_by_xpath('/html').send_keys(Keys.PAGE_DOWN)

    for i in range(1, 6):
        driver.find_element_by_xpath(f'//*[@id="J_goodsList"]/ul/li[{i}]/div/div[1]/a/img').click()
    handles = driver.window_handles
    for handle in handles:
        driver.switch_to.window(handle)
        url = driver.current_url  # 获取url
        if url == 'https://item.jd.com/100005855774.html':
            break

    driver.quit()

if __name__ == '__main__':
    # foo1()
    # foo2()
    foo3()
